home *** CD-ROM | disk | FTP | other *** search
Text File | 1998-06-17 | 1.1 KB | 59 lines | [TEXT/CWIE] |
- // DeferredTaskTime.cp
-
- #ifndef DeferredTaskTime_h
- #include "DeferredTaskTime.h"
- #endif
- #ifndef Procedure_h
- #include "Procedure.h"
- #endif
- #ifndef Deferer_h
- #include "Deferer.h"
- #endif
- #ifndef __TIMER__
- #include <Timer.h>
- #endif
-
- bool DeferredTaskTime::isNow = false;
-
- void DeferredTaskTime::Execute( DeferredTaskTimeProcedure& action )
- {
- if ( IsNow() )
- {
- action( DeferredTaskTime() );
- return;
- }
-
- static Deferer deferer;
- deferer.Defer( action );
-
- TryToCauseInterrupt();
-
- while ( !deferer.Pending() )
- ;
- }
-
- pascal void DeferredTaskTime::DoNothing()
- {
- }
-
- void DeferredTaskTime::TryToCauseInterrupt()
- {
- #if GENERATINGCFM
- static RoutineDescriptor DoNothing =
- BUILD_ROUTINE_DESCRIPTOR( uppTimerProcInfo, DeferredTaskTime::DoNothing );
- #endif
-
- TMTask timeTask;
- timeTask.tmAddr = &DoNothing;
- timeTask.tmWakeUp = 0;
-
- InsTime( reinterpret_cast<QElem *>( &timeTask ) );
- PrimeTime( reinterpret_cast<QElem *>( &timeTask ), -1 );
-
- volatile TMTask& volatileTask( timeTask );
- while ( (volatileTask.qType & 0x8000) != 0 )
- ;
-
- RmvTime( reinterpret_cast<QElem *>( &timeTask ) );
- }
-